]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
AppMenuButton: Improve handling of signals
authorTim Lunn <tim@feathertop.org>
Sun, 21 Apr 2013 23:49:14 +0000 (09:49 +1000)
committerTim Lunn <tim@feathertop.org>
Mon, 22 Apr 2013 00:14:48 +0000 (10:14 +1000)
If for some reason an extension needs to destroy the AppMenu object,
currently it is not possible to do this cleanly due to these signals
remaining connected.

https://bugzilla.gnome.org/show_bug.cgi?id=698531

js/ui/panel.js

index 5d2952cf77f486e53b55e912cf2cd4b21dcbfbc4..332be12b137b9c0b8156d7d62d60c37ebea74676 100644 (file)
@@ -289,10 +289,10 @@ const AppMenuButton = new Lang.Class({
         this._visible = !Main.overview.visible;
         if (!this._visible)
             this.actor.hide();
-        Main.overview.connect('hiding', Lang.bind(this, function () {
+        this._overviewHidingId = Main.overview.connect('hiding', Lang.bind(this, function () {
             this.show();
         }));
-        Main.overview.connect('showing', Lang.bind(this, function () {
+        this._overviewShowingId = Main.overview.connect('showing', Lang.bind(this, function () {
             this.hide();
         }));
 
@@ -302,10 +302,12 @@ const AppMenuButton = new Lang.Class({
 
         let tracker = Shell.WindowTracker.get_default();
         let appSys = Shell.AppSystem.get_default();
-        tracker.connect('notify::focus-app', Lang.bind(this, this._focusAppChanged));
-        appSys.connect('app-state-changed', Lang.bind(this, this._onAppStateChanged));
-
-        global.window_manager.connect('switch-workspace', Lang.bind(this, this._sync));
+        this._focusAppNotifyId =
+            tracker.connect('notify::focus-app', Lang.bind(this, this._focusAppChanged));
+        this._appStateChangedSignalId =
+            appSys.connect('app-state-changed', Lang.bind(this, this._onAppStateChanged));
+        this._switchWorkspaceNotifyId =
+            global.window_manager.connect('switch-workspace', Lang.bind(this, this._sync));
 
         this._sync();
     },
@@ -643,6 +645,33 @@ const AppMenuButton = new Lang.Class({
 
         this.setMenu(menu);
         this._menuManager.addMenu(menu);
+    },
+
+    destroy: function() {
+        if (this._appStateChangedSignalId > 0) {
+            let appSys = Shell.AppSystem.get_default();
+            appSys.disconnect(this._appStateChangedSignalId);
+            this._appStateChangedSignalId = 0;
+        }
+        if (this._focusAppNotifyId > 0) {
+            let tracker = Shell.WindowTracker.get_default();
+            tracker.disconnect(this._focusAppNotifyId);
+            this._focusAppNotifyId = 0;
+        }
+        if (this._overviewHidingId > 0) {
+            Main.overview.disconnect(this._overviewHidingId);
+            this._overviewHidingId = 0;
+        }
+        if (this._overviewShowingId > 0) {
+            Main.overview.disconnect(this._overviewShowingId);
+            this._overviewShowingId = 0;
+        }
+        if (this._switchWorkspaceNotifyId > 0) {
+            global.window_manager.disconnect(this._switchWorkspaceNotifyId);
+            this._switchWorkspaceNotifyId = 0;
+        }
+
+        this.parent();
     }
 });